# 代码是“参考”后浪号abyss同学的，装饰器这一块还不太会，正在学，以后再后头看...
# 迭代器（强调的是数据上的传输）： 是一个未知长度的数据流，通过内置函数iter来获取迭代器对象，
# 然后通过next函数来获取下一个元素， 如果元素取完会报 StopIteration。 iter函数需要传入
# 一个可迭代对象，可迭代对象就是可以实现位置索引的序列对象。
#
# 生成器（强调的是指令上的执行）： 是一个特殊的迭代器，提供了惰性延迟的功能，函数中使用yield关键字，
# 通过next函数获取下一个元素，如果元素取完会报 StopIteration。 惰性延迟：
# 可以不一次性调用元素，内存中只存一个值。
def cache_deco(func):
    cache = {}

    def wrapper(n):
        if n in cache:
            return cache[n]
        result = func(n)
        cache[n] = result
        return result
    return wrapper


@cache_deco
def fibo(n):
    print("called")
    if n < 2:
        return n
    return fibo(n - 1) + fibo(n - 2)


if __name__ == "__main__":
    print(fibo(10))
    print('before cache')
    print(fibo(10))

